package com.bfsuolframework.core.utils;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;

import com.bfsuolframework.core.dao.keygen.KeyGen;

public class KeyGenUtils {
	
	protected final Logger logger = Logger.getLogger(getClass());
	
	@Resource(name="keygen")
	private static KeyGen keygen;
	
	private static final com.bfsuolframework.core.utils.KeyGenUtils instance = new com.bfsuolframework.core.utils.KeyGenUtils();
	
	private KeyGenUtils(){
		if(logger.isDebugEnabled()){
			logger.debug(" keygen autowire");
		}
	}
	
	/**
	 * 返回整型的序列值，如果不存在，默认的起始值为1，最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @return
	 * @throws DataAccessException
	 */
	public static int nextIntValue(String key){
		return (int) nextIntValue(key,1);
	}
	/**
	 * 返回整型的序列值，如果不存在，默认的最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @return 整型的序列值
	 * @throws DataAccessException
	 */
	public static int nextIntValue(String key,int defaultStart){
		return (int) nextIntValue(key,defaultStart,0,1);
	}
	/**
	 * 返回整型的序列值
	 * @param key 键
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @param defaultMaxValue 如果不存在，最大值，默认为10的27方-1
	 * @param defaultIncrementer 如果不存在，增长幅度，默认为1
	 * @return 整型的序列值
	 * @throws DataAccessException
	 */
	public static int nextIntValue(String key,int defaultStart,int defaultMaxValue,int defaultIncrementer) throws DataAccessException{
		return (int) instance.getNextValue(key,defaultStart,defaultMaxValue,defaultIncrementer);
	}

	/**
	 * 返回长整型的序列值，如果不存在，默认的起始值为1，最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @return 长整型的序列值
	 * @throws DataAccessException
	 */
	public static long nextLongValue(String key){
		return nextLongValue(key,1);
	}
	/**
	 * 返回长整型的序列值，如果不存在，默认最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @return 长整型的序列值
	 * @throws DataAccessException
	 */
	public static long nextLongValue(String key,int defaultStart){
		return nextLongValue(key,defaultStart,0,1);
	}
	/**
	 * 返回长整型的序列值
	 * @param key 键
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @param defaultMaxValue 如果不存在，最大值，默认为10的27方-1
	 * @param defaultIncrementer 如果不存在，增长幅度，默认为1
	 * @return 长整型的序列值
	 * @throws DataAccessException
	 */
	public static long nextLongValue(String key,int defaultStart,int defaultMaxValue,int defaultIncrementer){
		return instance.getNextValue(key,defaultStart,defaultMaxValue,defaultIncrementer);
	}

	/**
	 * 返回字符型的序列值，如果不设长度，默认为原长度，如果不存在，默认的起始值为1，最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @return 字符型的序列值
	 * @throws DataAccessException
	 */
	public static String nextStringValue(String key){
		return nextStringValue(key,0,1,0,1);
	}
	/**
	 * 返回字符型的序列值，如果不存在，默认的起始值为1，最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @param length 字符长度
	 * @return 字符型的序列值
	 * @throws DataAccessException
	 */
	public static String nextStringValue(String key,int length){
		return nextStringValue(key,length,1,0,1);
	}
	/**
	 * 返回字符型的序列值，如果不存在，默认的最大值为10的27方-1，增长幅度为1
	 * @param key 键
	 * @param length 字符长度
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @return 字符型的序列值
	 * @throws DataAccessException
	 */
	public static String nextStringValue(String key,int length,int defaultStart){
		return nextStringValue(key,length,defaultStart,0,1);
	}
	
	/**
	 * 返回字符型的序列值
	 * @param key 键
	 * @param length 字符长度
	 * @param defaultStart 如果不存在，起始值，默认为1
	 * @param defaultMaxValue 如果不存在，最大值，默认为10的27方-1
	 * @param defaultIncrementer 如果不存在，增长幅度，默认为1
	 * @return 字符型的序列值
	 * @throws DataAccessException
	 */

	public static String nextStringValue(String key,int length,int defaultStart,int defaultMaxValue,int defaultIncrementer){
		String s = String.valueOf(instance.getNextValue(key,defaultStart,defaultMaxValue,defaultIncrementer));
		int len = s.length();
		if (len < length) {
			StringBuffer buf = new StringBuffer(length);
			for (int i = 0; i < length - len; i++) {
				buf.append('0');
			}
			buf.append(s);
			s = buf.toString();
		}
		return s;
	}
	
	private long getNextValue(String key,int defaultStart,int defaultMaxValue,int defaultIncrementer){
		if (keygen == null) {
			throw new IllegalArgumentException("KeyGen类不能为空！");
		}
		long value = keygen.getNextValue(key, defaultStart, defaultMaxValue, defaultIncrementer);
		if(logger.isDebugEnabled()){
			logger.debug(" key is " + key + " and value is " + value);
		}
		return value;
	}
}
